home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / xcoral / xcoral.lha / xcoral-1.72 / browser_eve.c < prev    next >
C/C++ Source or Header  |  1993-02-23  |  26KB  |  1,060 lines

  1. /*
  2. ** Copyright 1989, 1992 by Lionel Fournigault
  3. **
  4. ** Permission to use, copy, and distribute for non-commercial purposes,
  5. ** is hereby granted without fee, providing that the above copyright
  6. ** notice appear in all copies and that both the copyright notice and this
  7. ** permission notice appear in supporting documentation.
  8. ** The software may be modified for your own purposes, but modified versions
  9. ** may not be distributed.
  10. ** This software is provided "as is" without any expressed or implied warranty.
  11. **
  12. **
  13. */
  14.  
  15. #include <stdio.h>
  16. #include <X11/Xlib.h>
  17. #include <X11/Xutil.h>
  18. #include <X11/cursorfont.h>
  19. #ifdef apollo
  20. #include <stdlib.h>
  21. #else
  22. #include <malloc.h>
  23. #endif
  24. #include <string.h>
  25. #include <sys/types.h>
  26. #include <sys/stat.h>
  27.  
  28. #include "options.h"
  29. #include "browser.h"
  30. #include "xcoral.h"
  31. #include "flist.h"
  32.  
  33. extern Browser br;
  34. extern char *b_name[];
  35.  
  36. static void     RefreshBrowserWindow (), ManageFiles (), ButtonEdit (),
  37.     SelectItem (), ClassSelect (), UpdateTitle (), ProcSelect (),
  38.     FileSelect (), MethodSelect (), UpdateItem (), ParentChildSelect (), 
  39.     EditFile (), GoodPage (), TitleVisit (), AddFiles (), RemoveFiles (),
  40.     ButtonInVisitWindow ();
  41.  
  42. /*
  43. **    Function name : ExposeBrowser
  44. **
  45. **    Description : Traitement d'un 'expose event'
  46. **    Input : L'event.
  47. **    Ouput :
  48. */
  49. void ExposeBrowser ( ev )
  50. XEvent *ev;
  51. {
  52.     register int i;
  53.     register int width;
  54.  
  55.     if ( ev -> xexpose.window == br.title ) {
  56.         if ( br.title_name != 0 )
  57.             UpdateTitle ( br.title_name );
  58.         else 
  59.             Display3D ( dpy, br.title, br.ts, br.bs, 1, 0 );    
  60.         return;
  61.     }
  62.  
  63.     if ( ev -> xexpose.window == br.main ) {
  64.         Display3D ( dpy, ev -> xexpose.window, br.ts, br.bs, 1, 0 );
  65.         return;
  66.     }
  67.     if ( ev -> xexpose.window == br.dec ) {
  68.         XClearWindow ( dpy, br.dec );
  69.         Display3D ( dpy, ev -> xexpose.window, br.ts, br.bs, 1, 0 );
  70.         if ( br.dec_imp_flag == DEC_MODE )
  71.             XDrawString ( dpy, ev -> xexpose.window, br.gc,
  72.                          ( B_BUTTON_WIDTH - XTextWidth ( br.font, "Decl", 4 )) / 2,
  73.                    br.font -> ascent + 3, "Decl", 4 );
  74.         else 
  75.             XDrawString ( dpy, ev -> xexpose.window, br.gc, 
  76.                    ( B_BUTTON_WIDTH - XTextWidth ( br.font, "Impl", 4 )) / 2,
  77.                 br.font -> ascent + 3, "Impl", 4 );
  78.         return;
  79.     }
  80.     if ( ev -> xexpose.window == br.add ) {
  81.         Display3D ( dpy, ev -> xexpose.window, br.ts, br.bs, 1, 0 ); 
  82.         XDrawString ( dpy, ev -> xexpose.window, br.gc, 
  83.             ( B_BUTTON_WIDTH - XTextWidth ( br.font, "Add", 3 )) / 2,
  84.                br.font -> ascent + 3, "Add", 3 );
  85.         return;
  86.     }
  87.     if ( ev -> xexpose.window == br.del ) {
  88.         Display3D ( dpy, ev -> xexpose.window, br.ts, br.bs, 1, 0 );
  89.         XDrawString ( dpy, ev -> xexpose.window, br.gc, 
  90.                ( B_BUTTON_WIDTH - XTextWidth ( br.font, "Del", 3 )) / 2,
  91.             br.font -> ascent + 3, "Del", 3 );
  92.         return;
  93.     }
  94.     if ( ev -> xexpose.window == br.edit ) {
  95.         Display3D ( dpy, ev -> xexpose.window, br.ts, br.bs, 1, 0 ); 
  96.         XDrawString ( dpy, ev -> xexpose.window, br.gc,
  97.             ( B_BUTTON_WIDTH - XTextWidth ( br.font, "Edit", 4 )) / 2,
  98.             br.font -> ascent + 3, "Edit", 4 );
  99.         return;
  100.     }
  101.  
  102.     for ( i = 0; i < 7; i++ ) {
  103.         if ( ev -> xexpose.window == br.tbw[i].frame ) {
  104.             Display3D ( dpy, ev -> xexpose.window, br.ts, br.bs, 1, 0 ); 
  105.             break;
  106.         } 
  107.         if ( ev -> xexpose.window == br.tbw[i].title) {
  108.             Display3D ( dpy, ev -> xexpose.window, br.ts, br.bs, 1, 0 );
  109.                         if ( i == W_VISIT ) {
  110.                 TitleVisit ( GetFileName ( br.tbw[W_VISIT].text )); 
  111.             }
  112.                         else {
  113.                                width = XTextWidth ( br.font, b_name [i], strlen (b_name [i]));
  114.                 XDrawString ( dpy, ev -> xexpose.window, br.gc, 
  115.                     (br.tbw[i].f_width - width)/2, br.font -> ascent + 3,            
  116.                     b_name [i], strlen (b_name [i]));                                                            
  117.             }                
  118.             break;
  119.         } 
  120.         if ( ev -> xexpose.window == br.tbw[i].text -> window ) {
  121.             RefreshBrowserWindow ( &br.tbw[i] ) ;
  122.             if ( i == W_VISIT ) {
  123.                 TextCursorOn ( br.tbw[W_VISIT].text );
  124.             }
  125.             break;
  126.         } 
  127.         if ( ev -> xexpose.window == br.tbw[i].scroll -> frame ) {
  128.             RefreshScrollFrame ( dpy,  br.tbw[i].scroll );
  129.             break;
  130.         } 
  131.         if ( ev -> xexpose.window == br.tbw[i].scroll -> scroll ) {
  132.             RefreshScrollBar ( dpy, br.tbw[i].scroll );
  133.             break;
  134.         } 
  135.     }
  136.     while ( XCheckWindowEvent ( dpy, ev -> xexpose.window, ExposureMask, ev ));
  137. }    
  138.  
  139.  
  140. /*
  141. **    Function name : SetBrowserVisibility
  142. **
  143. **    Description : Positionne l'etat de visibilite de la
  144. **        fenetre de controle.
  145. **
  146. **    Input : L'event.
  147. **    Ouput :
  148. */
  149. int SetBrowserVisibility ( ev )
  150. XEvent *ev;
  151. {
  152.     if ( ev -> xvisibility.window == br.main ) {
  153.         br.visible = ev -> xvisibility.state;
  154.         return True;
  155.     }
  156.     return False;
  157. }
  158.  
  159.  
  160. /*
  161. **    Function name : RefreshBrowserWindow
  162. **
  163. **    Description : Comme son nom l'indique.
  164. **    Input : Le contexte
  165. **    Ouput :
  166. */
  167. static void RefreshBrowserWindow ( bwin )
  168. BWin *bwin;
  169. {
  170.     XClearWindow ( dpy, bwin -> text -> window );
  171.     Display3D ( dpy, bwin -> text -> window, br.ts, br.bs, 2, 1 ); 
  172.     ClipOn ( bwin -> text, 0 );
  173.     SetLinesTable ( bwin -> text );
  174.     RefreshPage ( bwin -> text );
  175.     ClipOff ( bwin -> text );
  176.     UpdateItem ( bwin, bwin -> select );
  177.     XFlush ( dpy );
  178. }
  179.  
  180.  
  181. /*
  182. **    Function name : ButtonBrowser
  183. **
  184. **    Description : Traitement d'un 'button press event'
  185. **    Input : L'event.
  186. **    Ouput : Vrai si le button press concerne le browser.
  187. */
  188. int ButtonBrowser ( ev )
  189. XButtonEvent *ev;
  190. {
  191.     Window w = ev -> window;
  192.     register int i;
  193.     int result;
  194.     
  195.     br.click_time = ev -> time;
  196.     if ( BrDoubleClick () == True ) {
  197. /*        
  198.         XGrabPointer ( dpy, w, True, ButtonReleaseMask, GrabModeAsync,
  199.             GrabModeAsync, w, None, CurrentTime );
  200.         WaitButtonRelease ( ev -> button );
  201. */
  202.         ButtonEdit ();
  203.         return True;
  204.     }
  205.     if ( (w == br.dec) ||  (w == br.add) || ( w == br.del) || ( w == br.edit ) ) {
  206.         Display3D ( dpy, w, br.ts, br.bs, 1, 1 );
  207.         XGrabPointer ( dpy, w, True, ButtonReleaseMask, GrabModeAsync,
  208.             GrabModeAsync, w, None, CurrentTime );
  209.         WaitButtonRelease ( ev -> button );
  210.                 Display3D ( dpy, w, br.ts, br.bs, 1, 0 );
  211.         if ( w == br.dec ) {
  212.             br.dec_imp_flag = ! br.dec_imp_flag;
  213.             XClearWindow ( dpy, w );
  214.             if ( br.dec_imp_flag == DEC_MODE )
  215.                 XDrawString ( dpy, w,br.gc, 
  216.                                 (B_BUTTON_WIDTH - XTextWidth ( br.font, "Decl", 4 )) / 2,
  217.                           br.font -> ascent + 3, "Decl", 4 );
  218.             else 
  219.                 XDrawString ( dpy, w, br.gc, 
  220.                                 (B_BUTTON_WIDTH - XTextWidth ( br.font, "Impl", 4 )) / 2,
  221.                     br.font -> ascent + 3, "Impl", 4 );
  222.                     Display3D ( dpy, w, br.ts, br.bs, 1, 0 );
  223.             if ( br.tbw[W_METHOD].select != 0 )
  224.                 MethodSelect ( &br.tbw[W_METHOD] );
  225.         }
  226.         else if ( w == br.edit )
  227.             ButtonEdit ();
  228.         else if ( w == br.add )
  229.             ManageFiles ( B_ADD );
  230.         else if ( w == br.del )
  231.             ManageFiles ( B_DEL );
  232.         return True;
  233.     }
  234.     for ( i = 0; i< 7; i++ ) {
  235.         if ( w == br.tbw[i].text -> window ) {
  236.             if ( i != W_VISIT ) {
  237.                 SelectItem ( &br.tbw[i], ev -> x, ev -> y, i );
  238.             }
  239.             else
  240.                 ButtonInVisitWindow ( &br.tbw[W_VISIT], ev );
  241. #ifdef DEBUG
  242.             (void) fprintf ( stderr, "Button BrowserText\n" );
  243. #endif
  244.             
  245.             return True;
  246.         }
  247.         if ( ButtonPressInScroll ( br.tbw[i].scroll, ev -> window, ev -> y, &result )) {
  248.             switch ( result ) {
  249.             case CURSOR:
  250.                 UpdateItem ( &br.tbw[i], br.tbw[i].select );
  251.  
  252.                 TextCursorOn ( br.tbw[i].text ); 
  253.                 TextCursorOff ( br.tbw[i].text );
  254. #ifdef DEBUG
  255.                 fprintf ( stderr, "Button BrowserScroll\n" );
  256. #endif
  257.                 if ( (TextInBuf ( br.tbw[i].text ) == True) 
  258.                     && ( br.tbw[i].text -> lines_in_buf > 1 )) {
  259.                     HandleScrollBar ( dpy, br.tbw[i].scroll,  ScrollNLine );
  260.                     RefreshScrollBar ( dpy, br.tbw[i].scroll ); 
  261.                 
  262.                 }
  263.                 if ( i != W_VISIT ) 
  264.                     UpdateItem ( &br.tbw[i], br.tbw[i].select );
  265.                 else 
  266.                     TextCursorOn ( br.tbw[i].text );
  267.                 break;
  268.             case NEXT:
  269.                 UpdateItem ( &br.tbw[i], br.tbw[i].select );
  270.                 TextCursorOff ( br.tbw[i].text );
  271.                 NextPage ( br.tbw[i].text );
  272.                 TextCursorOff ( br.tbw[i].text );
  273.                 UpdateItem ( &br.tbw[i], br.tbw[i].select );
  274.                 break;
  275.             case PREVIOUS:
  276.                 UpdateItem ( &br.tbw[i], br.tbw[i].select );
  277.                 TextCursorOff ( br.tbw[i].text );
  278.                 PreviousPage ( br.tbw[i].text );
  279.                 TextCursorOff ( br.tbw[i].text );
  280.                 UpdateItem ( &br.tbw[i], br.tbw[i].select );
  281.                 break;
  282.             }
  283.             return True;
  284.         }
  285.     }
  286.     return False;
  287. }
  288.  
  289. /*
  290. **    Function name : BrDoubleClick
  291. **
  292. **    Description : 
  293. **    Input : 
  294. **    Ouput :
  295. */
  296. int BrDoubleClick ()
  297. {
  298.     if ( br.old_click == 0 ) 
  299.         return False;
  300.  
  301.     if ( (br.click_time - br.old_click) < 300)
  302.         return True;
  303.     else
  304.         return False;
  305. }
  306.  
  307. /*
  308. **    Function name : ManageFiles
  309. **
  310. **    Description : Modification de de la base.
  311. **        Ajoute un fichier/directorie ou
  312. **        retire un fichier.
  313. **
  314. **    Input : Le type d'operation a effectuer.
  315. **    Ouput :
  316. */
  317. static void ManageFiles ( op )
  318.     register int op;
  319. {
  320.        int len;
  321.  
  322.     if ( br.visible != VisibilityUnobscured ) {
  323.         XRaiseWindow ( dpy, br.frame );
  324.         return;
  325.     }
  326.  
  327.        if ( op == B_DEL ) {
  328.               register char *del_filename, *tmp, *buf;
  329.         if ( br.tbw[W_FILES].select != 0 )  {
  330.             HoleToLeft ( br.filebuf );
  331.             if ( (br.tbw[W_FILES].select - 1) != 0)
  332.                 (void) MoveToLine ( br.filebuf, br.tbw[W_FILES].select - 1 );
  333.                tmp = GetCurrentLine ( br.filebuf, &len  );
  334.                      *(tmp + len ) = '\0'; /* On vire le newline */
  335.                      del_filename =  (char *) malloc ( (unsigned) len + 2 );
  336.                      (void) strcpy ( del_filename, tmp );
  337.             buf = malloc ( (unsigned) len + 32 );
  338.             (void) sprintf ( buf, "Remove file selected [y/n/all] : "  );
  339.  
  340.                     tmp = (char *) GetStringFromDialogBox ( br.frame, buf );
  341.             if ( (tmp == 0) || (strncmp(tmp, "y", 1) == 0 )) 
  342.                 RemoveFiles ( del_filename );
  343.             else if ( strcmp ( tmp, "all" ) == 0 ) 
  344.                 RemoveFiles ( (char *) 0 );
  345.             if ( del_filename != 0 )
  346.                          (void) free ( del_filename );
  347.                      if ( buf != 0 )
  348.                   (void) free ( buf );
  349.         }
  350.         else {
  351.             tmp = (char *) GetStringFromDialogBox ( br.frame, 
  352.                 "Delete all files [y/n] : " );
  353.             if ( (tmp == 0) || (strncmp(tmp, "y", 1) == 0 )
  354.                 || (strncmp(tmp, "all", 3)) == 0 )
  355.                 RemoveFiles ( (char *) 0 );
  356.         }
  357.      }
  358.     else 
  359.         AddFiles ();
  360. }
  361.  
  362.  
  363. /*
  364. **    Function name : AddFiles
  365. **
  366. **    Description : Ajoute un fichier ou une directorie.
  367. **    Input : 
  368. **    Ouput :
  369. */
  370. static void AddFiles ()
  371. {
  372.     register char *s;
  373.        struct stat st;
  374.  
  375.     (void) chdir ( br.dir );
  376.  
  377.     s = (char *) GetStringFromSelect ( br.frame, FILESELECT ); 
  378.     if ( (s != 0) && (strlen (s) != 0 )) {
  379.         (void) stat ( s, &st );
  380.         if ( S_ISDIR(st.st_mode) != 0 ) {
  381.                XDefineCursor ( dpy, br.frame, 
  382.                 XCreateFontCursor ( dpy, XC_watch ) );
  383.                      XFlush (dpy ); 
  384. #ifdef DEBUG
  385.             (void) fprintf ( stderr, "dir : %s\n", s );
  386. #endif
  387.                      LoadDir ( s, RECURSIVE );
  388.             XUndefineCursor ( dpy, br.frame );
  389.             SetBrowserDir ( s );
  390.         }
  391.         else if ( S_ISREG(st.st_mode) != 0 ) {
  392.             if ( GoodSuffix ( s ) == True )
  393.                 parse_file ( s ); 
  394.         }
  395.         RefreshBrowserInfos ();
  396.     }
  397.        if ( s != 0 )
  398.         (void) free (s);
  399. }
  400.  
  401.  
  402.  
  403. /*
  404. **    Function name : RemoveFiles
  405. **
  406. **    Description : Retire un ficher ou tous les fichiers
  407. **        de la base.
  408. **    Input : Le nom du fichiers.
  409. **    Ouput :
  410. */
  411. static void RemoveFiles ( name )
  412. register char *name;
  413. {
  414.     register char *tmp, *p;
  415.     register int i, nbfiles;
  416.     int len;
  417.  
  418.     if ( name != 0 )
  419.         delete_file ( name );
  420.     else {
  421.         HoleToLeft ( br.filebuf );             /* Debut du buffer */
  422.         nbfiles = GetNumberOfLineInBuf ( br.filebuf );     /* Nb fichiers */
  423.         nbfiles--;
  424.     
  425.         for ( i=0; i < nbfiles; i++ ) {
  426.             p = (char *) GetCurrentLine ( br.filebuf, &len );
  427.             tmp = (char *) malloc ( (unsigned) (len + 1) );
  428.             (void) strncpy ( (char *) tmp, p, len );
  429.             tmp [len] = '\0';
  430.             (void) MoveToLine ( br.filebuf, 1 );
  431.             delete_file ( tmp );
  432.                      if ( tmp != 0 )
  433.                 (void) free ( tmp );
  434.         }
  435.     }
  436.  
  437.     /* Refresh windows */
  438.     RefreshBrowserInfos ();
  439.     if ( name == 0) { /* Clear Browser */
  440.         KillText ( dpy, br.tbw[W_VISIT].text );
  441.         ConfigScroll ( &br.tbw[W_VISIT] );
  442.         TitleVisit ( " " );
  443.         UpdateTitle ( " " );
  444.     }
  445.     else { /* Un fichier seulement */
  446.         if  ( strcmp ( br.title_name, name ) == 0 ) {
  447.             KillText ( dpy, br.tbw[W_VISIT].text );    
  448.             ConfigScroll ( &br.tbw[W_VISIT] );
  449.             TitleVisit ( " " );
  450.         }
  451.     }
  452. }
  453.  
  454.  
  455. /*
  456. **    Function name : GoodSuffix
  457. **
  458. **    Description : Check filename.
  459. **
  460. **    Input : Le nom du fichier.
  461. **    Ouput : Vrai si .c .h .cc .cxx .C. Faux sinon
  462. */
  463. int GoodSuffix ( s )
  464.     register char *s;
  465. {
  466.     register char *end_name;
  467.  
  468.     end_name = (char * ) strrchr ( (char *) s, '.' );
  469.     if ( end_name == 0 )
  470.             return False;
  471.        
  472.     if ( (strcmp( end_name, ".c") == 0) 
  473.         || ( strcmp( end_name, ".h") == 0 )
  474.         || ( strcmp( end_name, ".cc") == 0 )
  475.         || ( strcmp( end_name, ".cxx") == 0 )
  476.               || ( strcmp( end_name, ".hxx") == 0 )
  477.         || ( strcmp( end_name, ".C") == 0 )) 
  478.         return True;
  479.     else
  480.         return False;
  481. }
  482.  
  483.  
  484. /*
  485. **    Function name : RefreshBrowserInfos
  486. **
  487. **    Description : Prepare la mise a jour des infos.
  488. **    Input : 
  489. **    Ouput :
  490. */
  491. void RefreshBrowserInfos ()
  492. {
  493.     register int i;
  494.     XEvent event;
  495.  
  496.     SetInfos ();     /* Classes, Procs, Files */
  497.     br.tbw[W_CLASS].select = br.tbw[W_PROC].select = br.tbw[W_FILES].select = 0;
  498.     br.tbw[W_PARENT].select = br.tbw[W_CHILD].select = br.tbw[W_METHOD].select = 0;
  499.  
  500.     if ( br.mode == STD_C ) 
  501.         i = 4;
  502.     else if ( br.mode == CPLUS )
  503.         i = 0;
  504.     else
  505.         return;
  506.  
  507.        if ( br.stat == B_UNMAP )
  508.               return;
  509.  
  510.     for ( i; i < 6; i++ ) {
  511.         while ( XCheckWindowEvent ( dpy,
  512.                 br.tbw[i].text -> window , ExposureMask, &event ));
  513.         switch ( i ) {
  514.         case W_FILES:
  515.         case W_PROC:
  516.         case W_CLASS:
  517.             RefreshBrowserWindow ( &br.tbw[i] );
  518.             FirstPage ( br.tbw[i].text );
  519.             break;
  520.         case W_PARENT:
  521.         case W_CHILD:
  522.         case W_METHOD:
  523.             KillText ( dpy, br.tbw[i].text ); 
  524.             break;
  525.         default:
  526.             break;
  527.         }
  528.         ConfigScroll ( &br.tbw[i] );            
  529.     }
  530. }
  531.  
  532.  
  533.  
  534. /*
  535. **    Function name : ButtonEdit
  536. **
  537. **    Description : Creation d'une fenetre d'edition pour
  538. **        l'objet courant.
  539. **    Input : 
  540. **    Ouput :
  541. */
  542. static void ButtonEdit ()
  543. {
  544.     EdWin     *ew;
  545.     register char *filename;
  546.        extern EdWin *CreateWindow ();
  547.     Text *text;
  548.    
  549.     filename = GetFileName ( br.tbw[W_VISIT].text ); 
  550.        if ( IsAlreadyLoad ( filename,  &text ) ) {
  551.             XMapRaised ( dpy, text -> w_parent );      
  552.                     GotoLineNumber ( text, br.tbw[W_VISIT].text -> no_current_line );
  553.         CurrentLineToTop ( text );      
  554.               return;
  555.     }
  556.        
  557.     ew = (EdWin * ) CreateWindow ();
  558.     if ( ew == 0 ) {
  559.         ( void ) fprintf ( stderr, "Create_env error\n" );
  560.         return;
  561.     }
  562.     switch ( br.mode ) {
  563.         case CPLUS:
  564.             ew -> text -> mode = CPLUS;
  565.             ew -> text -> mwin -> mode = CPLUS;
  566.             SetBrowserMode ( CPLUS );
  567.             break;
  568.         case STD_C:
  569.             ew -> text -> mode = STD_C;
  570.             ew -> text -> mwin -> mode = STD_C;
  571.             SetBrowserMode ( STD_C );
  572.             break;
  573.         default:
  574.             break;
  575.     }    
  576. /*    filename = GetFileName ( br.tbw[W_VISIT].text ); */
  577.     if ( (filename != 0) && (strcmp(filename, "NoName")!=0) ) {
  578.         (void) strcpy ( ew -> text -> current_dir, br.dir );
  579.         if ( LoadFile ( ew -> text, filename, NEW ) != -1 )
  580.             GotoLineNumber ( ew ->text, br.tbw[W_VISIT].text -> no_current_line );
  581.               else 
  582.                   return;
  583.     }
  584.     else {
  585.         (void) strcpy ( ew -> text -> current_dir, br.dir );
  586.     }
  587.     XStoreName ( dpy, ew -> w_frame, ew -> text -> filename );
  588.     XMapWindow ( dpy, ew->w_frame );
  589.     XFlush ( dpy );
  590. }
  591.  
  592.  
  593. /*
  594. **    Function name : SelectItem
  595. **
  596. **    Description : Un item a ete selectionne dans une
  597. **        des fenetres de texte.
  598. **
  599. **    Input : Le contexte, la position, le type.
  600. **    Ouput :
  601. */
  602. static void SelectItem ( bwin, x, y, i )
  603.     BWin *bwin;
  604.     register int x, y;
  605.     register int i;
  606. {
  607.     register int n;
  608.     register int scroll = bwin -> text -> sl;
  609.  
  610.     if ( ( bwin -> text -> lines_in_buf == 1 ) 
  611.         || (MoveToXYinTextWindow ( bwin -> text,  x, y ) == -1 ))
  612.             return;
  613.  
  614.     TextCursorOn ( bwin -> text );
  615.     TextCursorOff ( bwin -> text );
  616.  
  617.     if ( (n = bwin -> text -> no_current_line) >= bwin -> text -> lines_in_buf ) {
  618.         return;
  619.     }
  620.  
  621.     if ( bwin -> text -> sl == scroll ) {
  622.         UpdateItem ( bwin, bwin -> select ); /* Eteint l'item courant */
  623.     }
  624.     UpdateItem ( bwin, n );     /* Allume l'item selectionne */
  625.     bwin -> select = n;
  626.  
  627.     switch ( i ) {
  628.         case W_CLASS:
  629.             ClassSelect ( bwin );
  630.             break;
  631.         case W_PARENT:
  632.         case W_CHILD:
  633.             ParentChildSelect ( &br.tbw[i] );
  634.             break;
  635.         case W_METHOD:
  636.             MethodSelect ( bwin );
  637.             break;
  638.         case W_PROC:
  639.             ProcSelect ( bwin );
  640.             break;
  641.         case W_FILES:
  642.             FileSelect ( bwin );
  643.             break;
  644.         default:
  645.             break;
  646.     }
  647.     br.old_click = br.click_time;
  648.     if ( br.visit_raise == True )
  649.         XMapRaised ( dpy, br.tbw[W_VISIT].frame );
  650. }
  651.  
  652.  
  653. /*
  654. **    Function name : ClassSelect
  655. **
  656. **    Description : Selection d'une classe
  657. **    Input : Le contexte
  658. **    Ouput :
  659. */
  660. static void ClassSelect ( bwin )
  661.     BWin *bwin;
  662. {
  663.     register char  *class_name;
  664.     register char **t_class;
  665.     int len;
  666.     Position *infos;
  667.     register char **tmp;
  668.  
  669.     class_name = (char *) GetCurrentLine ( br.tbw[W_CLASS].buf, &len);
  670.     class_name [len] = '\0';
  671.     UpdateTitle ( class_name );
  672.     infos = get_class_decl ( REMOVE_CLASS_INFO (class_name) );
  673.     
  674.     if ( infos == 0 ) return;
  675.  
  676.     ClearBuffer ( br.tbw[W_VISIT].buf );
  677.     EditFile ( &br.tbw[W_VISIT], infos -> file_name );
  678.     GoodPage ( &br.tbw[W_VISIT], infos -> line_number );
  679.        if ( infos != 0 )
  680.         (void) free ( (char *) infos );
  681.  
  682.     t_class = br.class_save + (bwin -> select -1);
  683.  
  684.     if ( t_class != 0 ) {
  685.               if ( br.methods_save != 0 )
  686.             (void) free ( (char *) br.methods_save );
  687.         br.methods_save = ( char **)  get_methods_list ( *t_class);
  688.         ExtractInfos ( br.methods_save, W_METHOD );
  689.         ConfigScroll ( &br.tbw[W_METHOD] ); 
  690.         br.tbw[W_METHOD].select = 0;
  691.         ClearPage ( br.tbw[W_METHOD].text );
  692.         FirstPage ( br.tbw[W_METHOD].text ); 
  693.  
  694.         tmp = ( char **)  get_parents_list ( *t_class);
  695.         ExtractInfos ( tmp, W_PARENT );
  696.               if ( tmp != 0 )
  697.             free ( (char *) tmp );
  698.         ConfigScroll ( &br.tbw[W_PARENT] ); 
  699.         br.tbw[W_PARENT].select = 0;
  700.         ClearPage ( br.tbw[W_PARENT].text );
  701.         FirstPage ( br.tbw[W_PARENT].text ); 
  702.  
  703.               FirstPage ( br.tbw[W_CHILD].text );
  704.         tmp = ( char **)  get_sons_list ( *t_class);
  705.         ExtractInfos ( tmp, W_CHILD );
  706.               if ( tmp != 0 )
  707.             free ( (char *) tmp );
  708.         ConfigScroll ( &br.tbw[W_CHILD] );
  709.         br.tbw[W_CHILD].select = 0;
  710.          ClearPage ( br.tbw[W_CHILD].text );
  711.         FirstPage ( br.tbw[W_CHILD].text ); 
  712.     }
  713. }
  714.  
  715.  
  716. /*
  717. **    Function name : UpdateTitle
  718. **
  719. **    Description : Mise a jour du titre principale.
  720. **
  721. **    Input : Le titre
  722. **    Ouput :
  723. */
  724. static void UpdateTitle ( name )
  725.     register char *name;
  726. {
  727.     if ( name == 0 )
  728.         return;
  729.     XClearWindow ( dpy, br.title );
  730.     XDrawString ( dpy, br.title, br.gc, 5, br.font -> ascent + 3, name, strlen ( name ));
  731.     Display3D ( dpy,br.title , br.ts, br.bs, 1, 0 );
  732.  
  733.     if ( br.title_name != 0 ) {
  734.         if ( strcmp ( br.title_name, name ) == 0 )
  735.             return;
  736.               if ( br.title_name != 0 )
  737.             (void) free ( br.title_name );
  738.     }
  739.     br.title_name = (char *) malloc ( (unsigned int) strlen (name) +1 );
  740.     (void) strcpy ( br.title_name, name );
  741. }
  742.  
  743.  
  744. /*
  745. **    Function name : ProcSelect
  746. **
  747. **    Description : Selection d'une fonction
  748. **    Input : Le contexte.
  749. **    Ouput :
  750. */
  751. static void ProcSelect ( bwin )
  752.     BWin *bwin;
  753. {
  754.     register char  *proc_name;
  755.     int len;
  756.     Position *infos;
  757.  
  758.     proc_name = (char *) GetCurrentLine ( bwin -> buf, &len);
  759.     proc_name [len] = '\0';
  760.     UpdateTitle ( proc_name );
  761.     infos = get_proc_impl ( proc_name );
  762.  
  763.     if ( infos != 0 ) {
  764.         ClearBuffer ( br.tbw[W_VISIT].buf );
  765.         EditFile ( &br.tbw[W_VISIT], infos -> file_name );
  766.         GoodPage ( &br.tbw[W_VISIT], infos -> line_number );
  767.     }
  768.        if ( infos != 0 )
  769.         (void) free ( (char *) infos );
  770. }
  771.  
  772.  
  773. /*
  774. **    Function name : FileSelect
  775. **
  776. **    Description : Selection d'un fichier
  777. **    Input : Le contexte.
  778. **    Ouput :
  779. */
  780. static void FileSelect ( bwin )
  781. BWin *bwin;
  782. {
  783.     register  char *name, **t_name;
  784.     int len;
  785.     
  786.     HoleToLeft ( br.filebuf );
  787.  
  788.     if ( (bwin -> select - 1) != 0) 
  789.         (void) MoveToLine ( br.filebuf, bwin -> select - 1 );
  790.  
  791.     name = GetCurrentLine ( br.filebuf, &len);
  792.  
  793.     name [len] = '\0';
  794.     UpdateTitle ( name );
  795.     t_name = br.files_save;
  796.  
  797.     while ( t_name != 0 ) {
  798.         if ( (*t_name != 0) && (strcmp(name, *t_name) == 0) ) 
  799.             break;
  800.         t_name ++;
  801.     }
  802.          
  803.     if ( name != 0 ) {
  804.         ClearBuffer ( br.tbw[W_VISIT].buf );
  805.         EditFile ( &br.tbw[W_VISIT], *t_name );
  806.         FirstPage ( br.tbw[W_VISIT].text );
  807.         TextCursorOn ( br.tbw[W_VISIT].text );
  808.     }
  809. }
  810.  
  811.  
  812. /*
  813. **    Function name : SelectMethod
  814. **
  815. **    Description : Selection d'une methode.
  816. **    Input : Le contexte.
  817. **    Ouput :
  818. */
  819. static void MethodSelect ( bwin )
  820.     BWin *bwin;
  821. {
  822.     register char  *method_name;
  823.     register char **t_methods;
  824.     int len;
  825.     Position *infos;
  826.         char *buf;
  827.  
  828.     method_name = (char *) GetCurrentLine ( br.tbw[W_METHOD].buf, &len);
  829.     method_name [len] = '\0';
  830.     t_methods = br.methods_save + ( bwin -> select - 1 );
  831. #ifndef lint
  832.     buf = (char *) malloc ( (unsigned) (strlen (GET_METHOD_CLASS(*t_methods))
  833.             + strlen ( *t_methods ) + 4) );
  834.     (void) strcpy ( buf, GET_METHOD_CLASS(*t_methods) );
  835. #else 
  836.     buf = 0;
  837. #endif
  838.     (void) strcat ( buf, "::" );
  839.     (void) strcat ( buf, *t_methods );
  840.         UpdateTitle ( buf );
  841.     if ( buf != 0 )
  842.         (void) free ( buf );
  843.     
  844.     if ( br.dec_imp_flag == DEC_MODE ) 
  845. #ifndef lint
  846.         infos =  get_method_decl ( GET_METHOD_CLASS(*t_methods), *t_methods );
  847.     else
  848.         infos =  get_method_impl ( GET_METHOD_CLASS(*t_methods), *t_methods );
  849. #else
  850.     infos = (Position*) t_methods;    /* affecte infos, et utilise t_methods */
  851. #endif
  852.     if ( infos != 0 ) {
  853.         ClearBuffer ( br.tbw[W_VISIT].buf );
  854.         EditFile ( &br.tbw[W_VISIT], infos -> file_name );
  855.         GoodPage ( &br.tbw[W_VISIT], infos -> line_number );
  856.     }
  857.     if ( infos != 0 )
  858.         (void) free ( (char *) infos );
  859. }
  860.  
  861.  
  862. /*
  863. **    Function name : UpdateItem
  864. **
  865. **    Description : Allume ou eteint l'item n dans une des fenetres
  866. **        du browser.
  867. **    Input : Le contexte, l'item.
  868. **    Ouput :
  869. */
  870. static void UpdateItem ( bwin, n )
  871.     BWin *bwin;
  872.     register int n;
  873. {
  874.     register int y;
  875.  
  876.     if ( (n == 0)
  877.         || ( n < (bwin -> text -> no_current_line - bwin -> text -> n1))
  878.         || ( n > (bwin -> text -> no_current_line + bwin -> text -> n2)))
  879.         return;
  880.  
  881.     y = n - ( bwin -> text -> no_current_line - bwin -> text -> n1 );
  882.     y *= bwin -> text -> font_height;
  883.     y += MARGE;
  884.  
  885.     XFillRectangle ( dpy, bwin -> text -> window,
  886.         bwin -> text -> Igc, MARGE,  y, 
  887.         bwin -> text -> width - ( 2 * MARGE ),
  888.         bwin -> text -> font_height + 1 );
  889. }
  890.  
  891.  
  892. /*
  893. **    Function name : PrentChildSelect
  894. **
  895. **    Description : Selection d'un parent/child
  896. **    Input : Le contexte.
  897. **    Ouput :
  898. */
  899. static void ParentChildSelect ( bwin )
  900.     BWin *bwin;
  901. {
  902.     register char *class_name;
  903.     register char **t_class;
  904.     register int i = 1;
  905.     int len;
  906.     register BWin *b_class = &br.tbw[W_CLASS];
  907.  
  908.     class_name = (char *) GetCurrentLine ( bwin -> buf, &len);
  909.     class_name [len] = '\0';
  910.  
  911.     UpdateTitle ( class_name );
  912.     class_name = REMOVE_CLASS_INFO(class_name);
  913.     
  914.     t_class = br.class_save;
  915.  
  916.     while ( t_class != 0 ) {
  917.         if ( (*t_class == 0) || (strcmp(class_name, *t_class) == 0) ) 
  918.             break;
  919.         t_class ++;
  920.         i++;
  921.     }
  922.     if ( *t_class == 0 ) {
  923.         UpdateItem ( &br.tbw[W_PARENT], br.tbw[W_PARENT].select );
  924.         UpdateTitle ( " " );
  925.         br.tbw[W_PARENT].select = 0;
  926.         return;
  927.     }
  928.     /* i = no ligne dans la liste des classes */
  929.     UpdateItem ( b_class, b_class -> select ); /* eteint l'item courant */
  930.     GotoLineNumber ( b_class -> text, i );
  931.     CurrentLineToTop ( b_class -> text );
  932.     UpdateItem ( b_class, b_class -> select ); /* allume l'item courant */
  933.     SelectItem ( b_class, 5, 5, W_CLASS );
  934. }
  935.  
  936.  
  937. /*
  938. **    Function name : EditFile
  939. **
  940. **    Description : Charge un fichier dans la fenetre de visite.
  941. **    Input : Le contexte, le nom du fichier.
  942. **    Ouput :
  943. */
  944. static void EditFile ( bwin, name )
  945.     BWin *bwin;
  946.     register char *name;
  947. {
  948.     TextCursorOff ( bwin -> text );
  949.     (void) strcpy ( bwin -> text -> current_dir, br.dir );
  950.     if ( LoadFile ( bwin ->text, name, NEW ) != -1 ) {
  951.         ShowScrollFrame ( dpy, bwin ->text -> swin );
  952.         FirstPage ( bwin ->text ); 
  953.             TitleVisit ( name );
  954.     }
  955.     TextCursorOn ( bwin ->text );
  956. }
  957.  
  958.  
  959. /*
  960. **    Function name : TitleVisit
  961. **
  962. **    Description : Met a jour le titre de la fenetre de visit.
  963. **    Input : Le nom a mettre.
  964. **    Ouput :
  965. */
  966. static void TitleVisit ( name )
  967.     register char *name;
  968. {
  969.     if ( (name != 0) && strlen (name) != 0 ) {
  970.         XClearWindow ( dpy, br.tbw[W_VISIT].title );
  971.         XDrawString ( dpy, br.tbw[W_VISIT].title, br.gc, 5, br.font -> ascent + 3,
  972.             name, strlen ( name) );
  973.         Display3D ( dpy,br.tbw[W_VISIT].title, br.ts, br.bs, 1, 0 );
  974.         }
  975. }    
  976.  
  977. /*
  978. **    Function name : GoodPage
  979. **
  980. **    Description : Positionne le fichier a la bonne page
  981. **    Input : Le contexte, le numero de ligne.
  982. **    Ouput :
  983. */
  984. static void GoodPage ( bwin, line )
  985.     BWin *bwin;
  986.     register int line;
  987. {
  988.     TextCursorOff ( bwin ->text );
  989.     GotoLineNumber ( bwin ->text, line );
  990.     CurrentLineToTop ( bwin ->text );
  991.     TextCursorOn ( bwin ->text );
  992. }
  993.  
  994.  
  995. /*
  996. **    Function name : ButtonInVisitWindow
  997. **
  998. **    Description : Traitement d'un 'button press' dans
  999. **        la fenetre de visit.
  1000. **    Input : Le contexte, l'event.
  1001. **    Ouput :
  1002. */
  1003. static void ButtonInVisitWindow ( bwin, ev )
  1004.     BWin *bwin;
  1005.     XButtonEvent *ev;
  1006. {
  1007.     XGrabPointer ( dpy, bwin -> text -> window , True,
  1008.         ButtonReleaseMask, GrabModeAsync, GrabModeAsync,
  1009.         bwin -> text -> window, None, CurrentTime );
  1010.  
  1011.     switch ( ev -> button ) {
  1012.         case Button1:
  1013.             TextCursorOff ( bwin -> text );
  1014.             (void) MoveToXYinTextWindow ( bwin -> text, ev -> x, ev -> y );
  1015.             TextCursorOn ( bwin -> text );
  1016.             break;
  1017.         case Button3:
  1018.             TextCursorOff ( bwin -> text );
  1019.             XSync ( dpy, False );
  1020.             StoreBytesInCutBuffer ( bwin -> text, ev -> x, ev -> y );
  1021.             TextCursorOn ( bwin -> text );
  1022.             break;
  1023.         default:
  1024.             break;
  1025.     }
  1026.     WaitButtonRelease ( ev -> button );
  1027. }
  1028.  
  1029.  
  1030. /*
  1031. **    Function name : KeyPressInBrowser
  1032. **
  1033. **    Description : Comme son nom l'indique.
  1034. **    Input : L'event.
  1035. **    Ouput : Vrai si 'Key press' dans une des fenetres
  1036. **        du browser.
  1037. */
  1038. int KeyPressInBrowser ( ev )
  1039.     XKeyEvent *ev;
  1040. {
  1041.     register int i;
  1042.  
  1043.     for ( i = 0; i < 7; i++ ) {
  1044.         if ( ev -> window == br.tbw [i].text -> window ) {
  1045. #ifdef DEBUG                
  1046.             fprintf ( stderr, "Key Press In Browser text\n");
  1047. #endif
  1048.             return True;
  1049.         }
  1050.     }
  1051.     if ( ev -> window == br.frame ) {
  1052. #ifdef DEBUG
  1053.         fprintf ( stderr, "Key Press In Browser frame\n");
  1054. #endif
  1055.         return True;
  1056.     }
  1057.     else
  1058.         return False;
  1059. }
  1060.